From 1dd3ee6b594e7a9fe9aeca0be8c67aedada16764 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 1 Dec 2012 01:49:06 +0100 Subject: [PATCH] css: Move default font handling The default font is no longer handled like a custom style sheet that overrides everything, but as the initial value. This is the same behavior as in web browsers. And it allows the theme to actually use the 'font-family' and 'font-size' properties. Of course, a well behaved theme will respect the setting as much as possible and for example use relative font sizes (which aren't yet supported, but will be soon). --- gtk/gtkcssinitialvalue.c | 62 +++++++++++++++++++++++++++++++++ gtk/gtksettings.c | 74 ---------------------------------------- 2 files changed, 62 insertions(+), 74 deletions(-) diff --git a/gtk/gtkcssinitialvalue.c b/gtk/gtkcssinitialvalue.c index c9d253427f..b70b794112 100644 --- a/gtk/gtkcssinitialvalue.c +++ b/gtk/gtkcssinitialvalue.c @@ -19,7 +19,11 @@ #include "gtkcssinitialvalueprivate.h" +#include "gtkcssarrayvalueprivate.h" +#include "gtkcssnumbervalueprivate.h" +#include "gtkcssstringvalueprivate.h" #include "gtkcssstylepropertyprivate.h" +#include "gtkstyleproviderprivate.h" struct _GtkCssValue { GTK_CSS_VALUE_BASE @@ -40,6 +44,64 @@ gtk_css_value_initial_compute (GtkCssValue *value, GtkCssComputedValues *parent_values, GtkCssDependencies *dependencies) { + GtkSettings *settings; + + switch (property_id) + { + case GTK_CSS_PROPERTY_FONT_FAMILY: + settings = _gtk_style_provider_private_get_settings (provider); + if (settings) + { + PangoFontDescription *description; + char *font_name; + GtkCssValue *value; + + g_object_get (settings, "gtk-font-name", &font_name, NULL); + description = pango_font_description_from_string (font_name); + g_free (font_name); + if (description == NULL) + break; + + if (pango_font_description_get_set_fields (description) & PANGO_FONT_MASK_FAMILY) + { + value = _gtk_css_array_value_new (_gtk_css_string_value_new (pango_font_description_get_family (description))); + pango_font_description_free (description); + return value; + } + + pango_font_description_free (description); + } + break; + + case GTK_CSS_PROPERTY_FONT_SIZE: + settings = _gtk_style_provider_private_get_settings (provider); + if (settings) + { + PangoFontDescription *description; + char *font_name; + GtkCssValue *value; + + g_object_get (settings, "gtk-font-name", &font_name, NULL); + description = pango_font_description_from_string (font_name); + g_free (font_name); + if (description == NULL) + break; + + if (pango_font_description_get_set_fields (description) & PANGO_FONT_MASK_SIZE) + { + value = _gtk_css_number_value_new ((double) pango_font_description_get_size (description) / PANGO_SCALE, GTK_CSS_PX); + pango_font_description_free (description); + return value; + } + + pango_font_description_free (description); + } + break; + + default: + break; + } + return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)), property_id, provider, diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 0aefce6374..e2af247d80 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -24,9 +24,6 @@ #include "gtksettings.h" -#include "gtkcssarrayvalueprivate.h" -#include "gtkcssnumbervalueprivate.h" -#include "gtkcssstringvalueprivate.h" #include "gtkmodules.h" #include "gtkmodulesprivate.h" #include "gtksettingsprivate.h" @@ -117,8 +114,6 @@ struct _GtkSettingsPrivate GdkScreen *screen; GtkCssProvider *theme_provider; GtkCssProvider *key_theme_provider; - GtkCssValue *default_font_family; - GtkCssValue *default_font_size; }; typedef enum @@ -1414,41 +1409,6 @@ gtk_settings_class_init (GtkSettingsClass *class) g_type_class_add_private (class, sizeof (GtkSettingsPrivate)); } -static void -settings_ensure_style (GtkSettings *settings) -{ - GtkSettingsPrivate *priv = settings->priv; - PangoFontDescription *description; - gchar *font_name; - PangoFontMask mask; - - if (priv->default_font_family) - return; - - g_object_get (settings, - "gtk-font-name", &font_name, - NULL); - - description = pango_font_description_from_string (font_name); - if (description) - mask = pango_font_description_get_set_fields (description); - else - mask = 0; - - if (mask & PANGO_FONT_MASK_FAMILY) - priv->default_font_family = _gtk_css_array_value_new (_gtk_css_string_value_new (pango_font_description_get_family (description))); - else - priv->default_font_family = _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")); - - if (mask & PANGO_FONT_MASK_SIZE) - priv->default_font_size = _gtk_css_number_value_new ((double) pango_font_description_get_size (description) / PANGO_SCALE, GTK_CSS_PX); - else - priv->default_font_size = _gtk_css_number_value_new (10.0, GTK_CSS_PX); - - pango_font_description_free (description); - g_free (font_name); -} - static void gtk_settings_provider_iface_init (GtkStyleProviderIface *iface) { @@ -1460,26 +1420,10 @@ gtk_settings_style_provider_get_settings (GtkStyleProviderPrivate *provider) return GTK_SETTINGS (provider); } -static void -gtk_settings_style_provider_lookup (GtkStyleProviderPrivate *provider, - const GtkCssMatcher *matcher, - GtkCssLookup *lookup) -{ - GtkSettings *settings = GTK_SETTINGS (provider); - - settings_ensure_style (settings); - - if (_gtk_css_lookup_is_missing (lookup, GTK_CSS_PROPERTY_FONT_FAMILY)) - _gtk_css_lookup_set (lookup, GTK_CSS_PROPERTY_FONT_FAMILY, NULL, settings->priv->default_font_family); - if (_gtk_css_lookup_is_missing (lookup, GTK_CSS_PROPERTY_FONT_SIZE)) - _gtk_css_lookup_set (lookup, GTK_CSS_PROPERTY_FONT_SIZE, NULL, settings->priv->default_font_size); -} - static void gtk_settings_provider_private_init (GtkStyleProviderPrivateInterface *iface) { iface->get_settings = gtk_settings_style_provider_get_settings; - iface->lookup = gtk_settings_style_provider_lookup; } static void @@ -1500,11 +1444,6 @@ gtk_settings_finalize (GObject *object) settings_update_provider (priv->screen, &priv->theme_provider, NULL); settings_update_provider (priv->screen, &priv->key_theme_provider, NULL); - if (priv->default_font_family) - _gtk_css_value_unref (priv->default_font_family); - if (priv->default_font_size) - _gtk_css_value_unref (priv->default_font_size); - G_OBJECT_CLASS (gtk_settings_parent_class)->finalize (object); } @@ -1710,19 +1649,6 @@ gtk_settings_get_property (GObject *object, static void settings_invalidate_style (GtkSettings *settings) { - GtkSettingsPrivate *priv = settings->priv; - - if (priv->default_font_family) - { - _gtk_css_value_unref (priv->default_font_family); - priv->default_font_family = NULL; - } - if (priv->default_font_size) - { - _gtk_css_value_unref (priv->default_font_size); - priv->default_font_size = NULL; - } - _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (settings)); } -- 2.30.2